import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'

let service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 10000 // 超时 10s
})

// 添加请求拦截器
service.interceptors.request.use(function(config) {
    // 绑定上token
    if (store.getters.token) {
        // 如果存在才进行token绑定
        config.headers.Authorization = `Bearer ${store.getters.token}`
    }
    return config
}, function(error) {
    // 请求错误
    // 基本用不着
    return Promise.reject(error)
})

// 添加响应拦截器
service.interceptors.response.use(function(response) {
    // Blob 设置，发现是二进制流文件就直接返回流数据
    if (response.data instanceof Blob) return response.data // 返回了Blob对象
    // 后台响应的状态码就是 2 开头
    let { success, data, message } = response.data
    if (success) {
        // 响应正确，正确的返回了数据
        return data
    }
    // 业务报错
    Message({ type: 'error', message: message })
    return Promise.reject(new Error(message))
}, async(error) => {
    // 由于所有的响应都是2开头，所以如果能进入到此，那必定是网络错误,或者是 401
    // 401
    if (error.response?.status === 401) {
        Message({ type: 'error', message: 'token失效' })
        // 说明是token过期
        await store.dispatch('user/logout')
        // 跳转回登录页
        router.push('/login')
        return Promise.reject(error)
    } else {
        Message({ type: 'error', message: '网络错误' })
        return Promise.reject(error)
    }
})

export default service
